home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / g / gnu_c / pmlsrc23.zoo / pmlsrc / cmult.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-19  |  4.0 KB  |  204 lines

  1. /************************************************************************
  2.  *                                    *
  3.  *                N O T I C E                *
  4.  *                                    *
  5.  *            Copyright Abandoned, 1987, Fred Fish        *
  6.  *                                    *
  7.  *    This previously copyrighted work has been placed into the    *
  8.  *    public domain by the author (Fred Fish) and may be freely used    *
  9.  *    for any purpose, private or commercial.  I would appreciate    *
  10.  *    it, as a courtesy, if this notice is left in all copies and    *
  11.  *    derivative works.  Thank you, and enjoy...            *
  12.  *                                    *
  13.  *    The author makes no warranty of any kind with respect to this    *
  14.  *    product and explicitly disclaims any implied warranties of    *
  15.  *    merchantability or fitness for any particular purpose.        *
  16.  *                                    *
  17.  ************************************************************************
  18.  */
  19.  
  20.  
  21. /*
  22.  *  FUNCTION
  23.  *
  24.  *    cmult   double precision complex multiplication
  25.  *
  26.  *  KEY WORDS
  27.  *
  28.  *    cmult
  29.  *    complex functions
  30.  *    machine independent routines
  31.  *    math libraries
  32.  *
  33.  *  DESCRIPTION
  34.  *
  35.  *    Computes double precision complex result of multiplication of
  36.  *    first double precision complex argument by second double
  37.  *    precision complex argument.
  38.  *
  39.  *  USAGE
  40.  *
  41.  *    COMPLEX cmult (z1, z2)
  42.  *    COMPLEX z1;
  43.  *    COMPLEX z2;
  44.  *
  45.  *  PROGRAMMER
  46.  *
  47.  *    Fred Fish
  48.  *    Tempe, Az 85281
  49.  *    (602) 966-8871
  50.  *
  51.  *  INTERNALS
  52.  *
  53.  *    Computes cmult(z1,z2) from:
  54.  *
  55.  *        1.    Let z1 = a + j b
  56.  *            Let z2 = c + j d
  57.  *
  58.  *        2.    r_cmult = (a*c - b*d)
  59.  *            i_cmult = (a*d + c*b)
  60.  *
  61.  *        3.    Then cmult(z1,z2) = r_cmult + j i_cmult
  62.  *
  63.  */
  64.  
  65. #if !defined (__M68881__) && !defined (sfp004)
  66.  
  67. #include <stdio.h>
  68. #include <math.h>
  69. #include "pml.h"
  70.  
  71. COMPLEX cmult (z1, z2)
  72. COMPLEX z1;
  73. COMPLEX z2;
  74. {
  75.     COMPLEX result;
  76.  
  77.     result.real = (z1.real * z2.real) - (z1.imag * z2.imag);
  78.     result.imag = (z1.real * z2.imag) + (z2.real * z1.imag);
  79.  
  80.     return (result);
  81. }
  82. #endif !defined (__M68881__) && !defined (sfp004)
  83. #ifdef    __M68881__
  84. __asm("
  85. .text
  86. .even
  87. _funcname:
  88.     .ascii    \"cmult\\0\"
  89.     .even
  90.  
  91. .globl    _cmult
  92. _cmult:
  93.     fmoved    sp@(4),fp0
  94.     fmoved    sp@(12),fp1
  95.     fmoved    sp@(20),fp2
  96.     fmoved    sp@(28),fp3
  97.     fmovex    fp0,fp4
  98.     movel    a1,d0        | pointer to result
  99.  
  100.     fmulx    fp2,fp4
  101.     fmulx    fp3,fp0
  102.     fmulx    fp1,fp2
  103.     fmulx    fp1,fp3
  104.  
  105.     fsubx    fp3,fp4
  106.     faddx    fp0,fp2
  107.  
  108.     fmoved    fp4,a1@
  109.     fmoved    fp2,a1@(8)
  110. ");    /* end asm    */
  111. #endif    __M68881__
  112.  
  113. #ifdef    sfp004
  114. __asm("
  115.  
  116. comm =     -6
  117. resp =    -16
  118. zahl =      0
  119.  
  120. .even
  121. .text
  122. .even
  123. _funcname:
  124.     .ascii    \"cmult\\0\"
  125.     .even
  126. .text
  127. .even
  128. .globl    _cmult
  129. _cmult:
  130.  
  131.     lea    0xfffa50,a0
  132.  
  133.     movew    #0x5400,a0@(comm)    | z1.real -> fp0
  134.     movel    a1,d0        | pointer to result
  135.     .long    0x0c688900, 0xfff067f8
  136.     movel    a7@(4),a0@        | load arg_hi
  137.     movel    a7@(8),a0@        | load arg_low
  138.  
  139.     movew    #0x5480,a0@(comm)    | z1.imag -> fp1
  140.     .long    0x0c688900, 0xfff067f8
  141.     movel    a7@(12),a0@        | load arg_hi
  142.     movel    a7@(16),a0@        | load arg_low
  143.  
  144.     movew    #0x5500,a0@(comm)    | z2.real -> fp2
  145.     .long    0x0c688900, 0xfff067f8
  146.     movel    a7@(20),a0@        | load arg_hi
  147.     movel    a7@(24),a0@        | load arg_low
  148.  
  149.     movew    #0x5580,a0@(comm)    | z2.imag -> fp3
  150.     .long    0x0c688900, 0xfff067f8
  151.     movel    a7@(28),a0@        | load arg_hi
  152.     movel    a7@(32),a0@        | load arg_low
  153.  
  154.     movew    #0x0200,a0@(comm)    | copy fp0 to fp4
  155.     .word    0x4a68,0xfff0,0x6bfa    | test
  156.  
  157. |    fmulx    fp2,fp4
  158.     movew    #0x0a23,a0@(comm)
  159.     .word    0x4a68,0xfff0,0x6bfa    | test
  160. |    fmulx    fp3,fp0
  161.     movew    #0x0c23,a0@(comm)
  162.     .word    0x4a68,0xfff0,0x6bfa    | test
  163. |    fmulx    fp1,fp2
  164.     movew    #0x0523,a0@(comm)
  165.     .word    0x4a68,0xfff0,0x6bfa    | test
  166. |    fmulx    fp1,fp3
  167.     movew    #0x05a3,a0@(comm)
  168.     .word    0x4a68,0xfff0,0x6bfa    | test
  169. |    fsubx    fp3,fp4
  170.     movew    #0x0e28,a0@(comm)
  171.     .word    0x4a68,0xfff0,0x6bfa    | test
  172. |    faddx    fp0,fp2
  173.     movew    #0x0122,a0@(comm)
  174.     .word    0x4a68,0xfff0,0x6bfa    | test
  175.  
  176. |    fmoved    fp4,a1@
  177.     movew    #0x7600,a0@(comm)        | 
  178.     .long    0x0c688900, 0xfff067f8
  179.     movel    a0@,a1@
  180.     movel    a0@,a1@(4)
  181.  
  182. |    fmoved    fp2,d1
  183.     movew    #0x7500,a0@(comm)        | 
  184.     .long    0x0c688900, 0xfff067f8
  185.     movel    a0@,a1@(8)
  186.     movel    a0@,a1@(12)
  187. ");    /* end asm    */
  188. #endif    sfp004
  189.  
  190. #if defined (__M68881__) || defined (sfp004)
  191. # ifdef ERROR_CHECK    /* no error checking for now    */
  192.  
  193. __asm("    
  194.     pea    _funcname
  195.     jmp    c_err_check
  196. ");    /* end asm    */
  197.  
  198. # else  ERROR_CHECK
  199.  
  200. __asm("rts");
  201.  
  202. # endif ERROR_CHECK
  203. #endif defined (__M68881__) || defined (sfp004)
  204.